package pkg

import (
	"crypto/tls"
	"errors"
	"fmt"
	"net/smtp"
)

func EmailSend(sender, code, recipient, title, context string) (bool, error) {
	// 配置邮箱信息
	from := sender            // 你的QQ邮箱地址
	password := code          // 你的QQ邮箱授权码
	to := []string{recipient} // 收件人QQ邮箱地址
	subject := title
	body := context

	// 构建邮件内容
	msg := []byte(fmt.Sprintf("To: %s\r\nFrom: %s\r\nSubject: %s\r\n\r\n%s",
		to[0], from, subject, body))

	// 配置SMTP服务器
	smtpServer := "smtp.qq.com"
	smtpPort := 465

	// 创建SMTP客户端
	auth := smtp.PlainAuth("", from, password, smtpServer)

	// 连接SMTP服务器
	conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", smtpServer, smtpPort), nil)
	if err != nil {
		return false, errors.New("连接SMTP服务器失败")
	}

	client, err := smtp.NewClient(conn, smtpServer)
	if err != nil {
		return false, errors.New("创建SMTP客户端失败")
	}
	defer client.Quit()

	// 认证
	if err = client.Auth(auth); err != nil {
		return false, errors.New("认证失败")
	}

	// 设置发件人
	if err = client.Mail(from); err != nil {
		return false, errors.New("设置发件人失败")
	}

	// 设置收件人
	for _, addr := range to {
		if err = client.Rcpt(addr); err != nil {
			return false, errors.New("设置收件人失败")
		}
	}

	// 发送邮件内容
	w, err := client.Data()
	if err != nil {
		return false, errors.New("准备发送数据失败")
	}

	_, err = w.Write(msg)
	if err != nil {
		return false, errors.New("写入邮件内容失败")
	}

	err = w.Close()
	if err != nil {
		return false, errors.New("关闭写入流失败")
	}

	fmt.Println("邮件发送成功!")
	return true, nil
}
